import time

from django.core.cache import cache, caches
from django.http import HttpResponse
from django.shortcuts import redirect
from django.urls import reverse
from django.utils.deprecation import MiddlewareMixin


# 创建一个中间件继承自django的中间件
class HelloMiddle(MiddlewareMixin):
    # 重写请求的prcess_request函数，本例用于获取请求地址
    # 应用范围是全局的，只要在views中有请求就会调用这个中间件
    def process_request(self,request):
        ip = request.META.get("REMOTE_ADDR")
        # 指定缓存库
        cache = caches["redis_backend"]

        print(ip)

        if request.path == '/djangocache/getphone':

            if ip == "127.0.0.1":
                return HttpResponse("恭喜你插队成功！！")

        if request.path == '/djangocache/search/':
            # # 尝试获取根据当前ip的cache
            # result = cache.get(ip)
            #
            # # 如果有cache 则代表访问频繁
            # if result:
            #     return HttpResponse("您的访问过于频繁，请10S后再试")
            #
            # # 如果没有cache就设置一个cache，过期时间10s
            # cache.set(ip,ip,timeout=10)

            ### =====================================#####

            # 需求2：限制用户在60s之内访问10次，超次则限制
            # 思路：将一次正常请求放入队列中，并将在队列超过60秒请求缓存给删除，如果队列大小还是大于10，则报错
            # 根据IP获取cache，没有则创立一个空列表
            requests = cache.get(ip,[])

            while requests and time.time() - requests[-1] > 60 :
                # 把60s之前的数据踢出列表
                requests.pop()
            # 如果列表仍大于10，则表示用户访问过多
            if len(requests) > 10 :
                return HttpResponse("需求2：您的访问过于频繁，请10S后再试")
            # 正常请求数据就往列表头插入
            requests.insert(0,time.time())
            # 设置到缓存中
            cache.set(ip, requests,timeout=60)

    def process_exception(self,request,exception):

        if request.path == "/djangocache/getphone":

            print(request,exception)

            # 如果有错误重定向到别的地址
            return redirect(reverse('DjangoCache:news'))
